rank-1 type
関数の型にparameterを含む関数
ちゃんというと (?)
rank-0 typeな関数をfirst class objectとして扱う関数
foo :: (a -> a) -> a -> aがrank-1であることは、「rank-0 typeを引数に取る」で説明がつく
しかしそれだけだとid :: a -> aがrank-1であることの説明がつかない
例
code:purs(hs)
id :: ∀ a. a -> a
foo :: ∀ a. (a -> a) -> a -> a
hoge :: ∀ a. Int -> a -- 実用的なものかは知らないけど、定義的にはコレも入るはず
forall aは全体にかかる
code:hs
foo :: forall a . (a -> Int) -> Int foo :: forall a . ((a -> Int) -> Int) -- 敢えて括弧を付けるなら 関数全体がforallで囲われている
2つある場合も同様
code:hs
fst :: forall a. forall b. (a,b) -> a
fst :: forall a b. (a,b) -> a